#                                                                    -*-perl-*-

$description = "Test proper behavior of MAKEFLAGS";

$details = "DETAILS";

# Normal flags aren't prefixed with "-"
run_make_test(q!
all: ; @echo /$(MAKEFLAGS)/
!,
              '-e -r -R', '/erR/');

# Long arguments mean everything is prefixed with "-"
run_make_test(q!
all: ; @echo /$(MAKEFLAGS)/
!,
              '--no-print-directory -e -r -R --trace', "#MAKEFILE#:2: update target 'all' due to: target does not exist
echo /erR --trace --no-print-directory/
/erR --trace --no-print-directory/");


# Recursive invocations of make should accumulate MAKEFLAGS values.
# Savannah bug #2216
run_make_test(q!
MSG = Fails
.RECIPEPREFIX = >
all:
> @echo '$@: MAKEFLAGS=$(MAKEFLAGS)'
> @MSG=Works $(MAKE) -e -f #MAKEFILE# jump
jump:
> @echo '$@ $(MSG): MAKEFLAGS=$(MAKEFLAGS)'
> @$(MAKE) -f #MAKEFILE# print
print:
> @echo '$@ $(MSG): MAKEFLAGS=$(MAKEFLAGS)'
.PHONY: all jump print
!,
                  '--no-print-directory',
                  'all: MAKEFLAGS= --no-print-directory
jump Works: MAKEFLAGS=e --no-print-directory
print Works: MAKEFLAGS=e --no-print-directory');

# Ensure MAKEFLAGS updates are handled immediately rather than later

mkdir('foo', 0777);
mkdir('bar', 0777);

run_make_test(q!
$(info MAKEFLAGS=$(MAKEFLAGS))
$(info INCLUDE_DIRS=$(.INCLUDE_DIRS))
MAKEFLAGS += -Ibar
$(info MAKEFLAGS=$(MAKEFLAGS))
$(info INCLUDE_DIRS=$(.INCLUDE_DIRS))
.PHONY: all
all: ; @echo 'MAKEFLAGS=$(MAKEFLAGS)' "\$$MAKEFLAGS=$$MAKEFLAGS"
!,
              '-I- -Ifoo', 'MAKEFLAGS= -I- -Ifoo
INCLUDE_DIRS=foo
MAKEFLAGS= -I- -Ifoo -Ibar
INCLUDE_DIRS=foo bar
MAKEFLAGS= -I- -Ifoo -Ibar $MAKEFLAGS= -I- -Ifoo -Ibar');

rmdir('foo');
rmdir('bar');

# Test that command line switches are all present in MAKEFLAGS.
# sv 62514.
my @opts;
my @flavors;

# Simple flags.
@opts = ('i', 'k', 'n', 'q', 'r', 's', 'w', 'd');
exists $FEATURES{'check-symlink'} and push @opts, 'L';
@flavors = ('=', ':=', ':::=', '+=-');

for my $fl (@flavors) {
for my $opt (@opts) {
  run_make_test("
MAKEFLAGS${fl}B
all:; \$(info makeflags='\$(MAKEFLAGS)')
", "-$opt", "/makeflags='B$opt'/");
}
}

# Strawberry Perl's exec()--or something!--appears to replace all /tmp with the
# user's %TEMP% value so we can't use that for -I testing.  Make a directory.

mkdir('localtmp', 0777);

# Switches which carry arguments.
@opts = (' -Ilocaltmp', ' -Onone', ' --debug=b', ' -l2.5');
for my $fl (@flavors) {
for my $opt (@opts) {
  run_make_test("
MAKEFLAGS${fl}B
all:; \$(info makeflags='\$(MAKEFLAGS)')
", "$opt", "/makeflags='B$opt'/");
}
}

# Long options which take no arguments.
# sv 62514.
@opts = (' --no-print-directory', ' --warn=undefined-var', ' --trace');
for my $fl (@flavors) {
for my $opt (@opts) {
run_make_test("
MAKEFLAGS${fl}B
all:; \$(info makeflags='\$(MAKEFLAGS)')
", "$opt", "/makeflags='B$opt'/");
}
}

# Test that make filters out duplicates.
# Each option is specified in the makefile, env and on the command line.
@opts = (' -Ilocaltmp', ' -Onone', ' --debug=b', ' -l2.5');
for my $fl (@flavors) {
for my $opt (@opts) {
$ENV{'MAKEFLAGS'} = $opt;
  run_make_test("
MAKEFLAGS${fl}B $opt
all:; \$(info makeflags='\$(MAKEFLAGS)')
", "$opt", "/makeflags='B$opt'/");
}
}

# Test that make filters out duplicates.
# Each option is specified in the makefile, env and on the command line.
# decode_switches reallocates when the number of parameters in sl->list exceeds 5.
# This test exercises the realloc branch.
for my $fl (@flavors) {
$ENV{'MAKEFLAGS'} = '-I1 -Onone --debug=b -l2.5 -I2 -I3 -I4 -I5 -I6 -I2 -I2';
run_make_test("
MAKEFLAGS${fl}B -I1 -Onone --debug=b -l2.5 -I2 -I3 -I4 -I5 -I6 -I2 -I2
all:; \$(info makeflags='\$(MAKEFLAGS)')
",
'-I1 -Onone --debug=b -l2.5 -I2 -I3 -I4 -I5 -I6',
"/makeflags='B -I1 -I2 -I3 -I4 -I5 -I6 -l2.5 -Onone --debug=b'/");
}

# A mix of multiple flags from env, the makefile and command line.
# Skip -L since it's not available everywhere
for my $fl (@flavors) {
$ENV{'MAKEFLAGS'} = 'ikB --no-print-directory --warn=undefined-var --trace';
run_make_test("
MAKEFLAGS${fl}iknqrswd -Ilocaltmp -Ilocaltmp -Onone -Onone -l2.5 -l2.5
all:; \$(info makeflags='\$(MAKEFLAGS)')
",
'-Onone -l2.5 -l2.5 -Onone -Ilocaltmp -iknqrswd -i -n -s -k -Ilocaltmp',
"/makeflags='Bdiknqrsw -Ilocaltmp -l2.5 -Onone --trace --warn=undefined-var'/");
}

# Verify MAKEFLAGS are all available to shell function at parse time.
for my $fl (@flavors) {
my $answer = 'Biknqrs -Ilocaltmp -l2.5 -Onone --no-print-directory --warn=undefined-var';
$ENV{'MAKEFLAGS'} = 'ikB --no-print-directory --warn=undefined-var';
run_make_test("
MAKEFLAGS${fl}iknqrsw -Ilocaltmp -Ilocaltmp -Onone -Onone -l2.5 -l2.5 --no-print-directory
\$(info at parse time '\$(MAKEFLAGS)')
XX := \$(shell echo \"\$\$MAKEFLAGS\")
all:; \$(info at build time makeflags='\$(XX)')
",
'-Onone -l2.5 -l2.5 -Onone -Ilocaltmp -iknqrs -i -n -s -k -Ilocaltmp',
"at parse time '$answer'
at build time makeflags='$answer'");
}

# Verify MAKEFLAGS and command line definitions are all available to shell function at parse time.
for my $fl (@flavors) {
$ENV{'MAKEFLAGS'} = 'ikB --no-print-directory --warn=undefined-var';
my $answer = 'Biknqrs -Ilocaltmp -l2.5 -Onone --no-print-directory --warn=undefined-var -- hello=world';
run_make_test("
MAKEFLAGS${fl}iknqrsw -Ilocaltmp -Ilocaltmp -Onone -Onone -l2.5 -l2.5 --no-print-directory
\$(info at parse time '\$(MAKEFLAGS)')
XX := \$(shell echo \"\$\$MAKEFLAGS\")
all:; \$(info at build time makeflags='\$(XX)')
",
'-Onone -l2.5 -l2.5 -Onone -Ilocaltmp -iknqrs -i -n -s -k -Ilocaltmp hello=world',
"at parse time '$answer'
at build time makeflags='$answer'");
}

# Verify that command line arguments are included in MAKEFLAGS
run_make_test(q!
all: ; @echo $(MAKEFLAGS)
!,
              '-e FOO=bar -r -R', 'erR -- FOO=bar');

# Long arguments mean everything is prefixed with "-"
run_make_test(q!
all: ; @echo /$(MAKEFLAGS)/
!,
              '--no-print-directory -e -r -R --trace FOO=bar',
              "#MAKEFILE#:2: update target 'all' due to: target does not exist
echo /erR --trace --no-print-directory -- FOO=bar/
/erR --trace --no-print-directory -- FOO=bar/");


# sv 63347.
# Verify that command line arguments are included in MAKEFLAGS
# when makefiles are parsed.
my $answer = 'erR -- hello:=world FOO=bar';
run_make_test(q!
$(info $(MAKEFLAGS))
all:; $(info $(MAKEFLAGS))
!, '-e FOO=bar -r -R hello:=world',
"$answer
$answer
#MAKE#: 'all' is up to date.\n");

# sv 63347.
# Same as above, with makefile setting the value of the same variables as
# defined on the cli.
$answer = 'erR -- hello:=world FOO=bar';
run_make_test(q!
$(info $(MAKEFLAGS))
FOO=moon
hello:=moon
$(info $(MAKEFLAGS))
all:; $(info $(MAKEFLAGS))
!, '-e FOO=bar -r -R hello:=world',
"$answer
$answer
$answer
#MAKE#: 'all' is up to date.\n");

# sv 63347.
# Same as above, with makefile overriding the value of cli definition.
$answer = 'erR -- hello:=world FOO=bar';
run_make_test(q!
$(info $(MAKEFLAGS))
override FOO=moon
override hello:=moon
export hello
$(info $(MAKEFLAGS))
all:; $(info $(MAKEFLAGS))
!, '-e FOO=bar -r -R hello:=world',
"$answer
$answer
$answer
#MAKE#: 'all' is up to date.\n");

# Same as above, and makefile overrides the value of cli definition.
# resets MAKEOVERRIDES.
$answer = 'rR -- hello:=world FOO=bar';
run_make_test(q!
$(info $(MAKEFLAGS))
override FOO=moon
override hello:=moon
export hello
$(info $(MAKEFLAGS))
MAKEOVERRIDES=
$(info $(MAKEFLAGS))
all:; $(info $(MAKEFLAGS))
!, 'FOO=bar -r -R hello:=world',
"$answer
$answer
rR -- \nrR
#MAKE#: 'all' is up to date.\n");

# sv 63347.
# MAKEFLAGS set is env and makefile sets MAKEFLAGS and there is a command
# line definition.
$answer = ' -- bye=moon hello=world';
$ENV{'MAKEFLAGS'} = 'hello=world';
run_make_test(q!
$(info $(MAKEFLAGS))
all:; $(info $(MAKEFLAGS))
!, 'bye=moon',
" -- bye=moon hello=world
 -- bye=moon hello=world
#MAKE#: 'all' is up to date.\n");

# sv 63347.
# Conditional assignment and MAKEFLAGS.
$answer = 'B -- bye=moon hello=world';
$ENV{'MAKEFLAGS'} = 'hello=world';
run_make_test(q!
$(info $(MAKEFLAGS))
MAKEFLAGS?=-k
$(info $(MAKEFLAGS))
all:; $(info $(MAKEFLAGS))
!, '-B bye=moon',
"$answer
$answer
$answer
#MAKE#: 'all' is up to date.\n");

# sv 63347.
# MAKEFLAGS set is env and makefile sets MAKEFLAGS and there is a command
# line definition.
for my $fl (@flavors) {
my $answer = ' -- bye=moon hello=world';
$ENV{'MAKEFLAGS'} = 'hello=world';
run_make_test("
\$(info \$(MAKEFLAGS))
MAKEFLAGS${fl}R
\$(info \$(MAKEFLAGS))
all:; \$(info \$(MAKEFLAGS))
", 'bye=moon',
"$answer
rR$answer
rR$answer
#MAKE#: 'all' is up to date.\n");
}

# sv 63347.
# Test changes introduced by makefiles to MAKEFLAGS.
for my $fl (@flavors) {
my $answer = 'rR --no-print-directory -- hello:=world FOO=bar';
run_make_test(q!
MAKEFLAGS+=--no-print-directory
$(info $(MAKEFLAGS))
MAKEFLAGS+=-k
$(info $(MAKEFLAGS))
all:; $(info $(MAKEFLAGS))
!, 'FOO=bar -r -R hello:=world',
"$answer
k$answer
k$answer
#MAKE#: 'all' is up to date.\n");
}

# sv 63347.
# Test changes introduced by makefiles to MAKEFLAGS.
# Same as above, but with -e.
for my $fl (@flavors) {
my $answer = 'erR -- hello:=world FOO=bar';
run_make_test(q!
MAKEFLAGS+=--no-print-directory
$(info $(MAKEFLAGS))
MAKEFLAGS+=-k
$(info $(MAKEFLAGS))
all:; $(info $(MAKEFLAGS))
!, '-e FOO=bar -r -R hello:=world',
"$answer
$answer
$answer
#MAKE#: 'all' is up to date.\n");
}

mkdir('bye', 0777);

create_file('bye/makefile',
'hello=moon
all:; $(info $(hello))');

# sv 63347.
# Test that a cli definition takes precedence over a definition set in
# submake.
run_make_test(q!
v:=$(shell $(MAKE) -C bye --no-print-directory)
all: ; $(info $(v))
!, 'hello=world', "world #MAKE#[1]: 'all' is up to date.\n#MAKE#: 'all' is up to date.");

# Same as above with the shell assignment operator.
run_make_test(q!
v \!= $(MAKE) -C bye --no-print-directory
all: ; $(info $(v))
!, 'hello=world', "world #MAKE#[1]: 'all' is up to date.\n#MAKE#: 'all' is up to date.");

unlink('bye/makefile');
rmdir('bye');

# sv 63347
# Invalid command line variable definition.
run_make_test(q!
all:; $(info $(hello))
!, 'hello=\'$(world\'', "#MAKEFILE#:2: *** unterminated variable reference.  Stop.\n", 512);

# sv 63347
# An unused invalid command line variable definition is ignored.
run_make_test(q!
all:; $(info good)
!, 'hello=\'$(world\'', "good\n#MAKE#: 'all' is up to date.\n");



# sv 63537
# Certain switches can be flipped on and off.
# -k/-S, -w/--no-print-directory and -s/--no-silent.
# Test the following aspects of behavior of these switches
# 1. A switch can be enabled or disabled in makefile.
# 2. A switch can be enabled or disabled in env.
# 3. A switch can be enabled or disabled on the command line.
# 4. Command line beats makefile.
# 5. Env beats makefile.
# 6. Command line beats env.
# 7. MAKEFLAGS contains each specified switch at parse and build time.
# 8. If contradicting switches are specified in multiple origins, MAKEFLAGS
#    contains the winning switch at parse and build time.
# 9. MAKEFLAGS does not contain the beaten switch.

@flavors = ('=', ':=', ':::=', '+=');

# sv 63537
# -w vs --no-print-directory

# -w on the command line.
run_make_test(q!
$(info $(MAKEFLAGS))
all:; $(info $(MAKEFLAGS))
!, '-w',
"#MAKE#: Entering directory '#PWD#'
w
w
#MAKE#: 'all' is up to date.
#MAKE#: Leaving directory '#PWD#'\n");

# -w in the env.
$ENV{'MAKEFLAGS'} = '-w';
run_make_test(q!
$(info $(MAKEFLAGS))
all:; $(info $(MAKEFLAGS))
!, '',
"#MAKE#: Entering directory '#PWD#'
w
w
#MAKE#: 'all' is up to date.
#MAKE#: Leaving directory '#PWD#'\n");

# -w in env, --no-print-directory on the command line.
$ENV{'MAKEFLAGS'} = '-w';
run_make_test(q!
$(info $(MAKEFLAGS))
all:; $(info $(MAKEFLAGS))
!, '--no-print-directory',
" --no-print-directory
 --no-print-directory
#MAKE#: 'all' is up to date.\n");

# --no-print-directory in env, -w on the command line.
$ENV{'MAKEFLAGS'} = '--no-print-directory';
run_make_test(q!
$(info $(MAKEFLAGS))
all:; $(info $(MAKEFLAGS))
!, '-w',
"#MAKE#: Entering directory '#PWD#'
w
w
#MAKE#: 'all' is up to date.
#MAKE#: Leaving directory '#PWD#'\n");

delete $ENV{'MAKEFLAGS'};

# -w in makefile.
for my $fl (@flavors) {
run_make_test("
MAKEFLAGS${fl}-w
\$(info \$(MAKEFLAGS))
all:; \$(info \$(MAKEFLAGS))
", '',
"#MAKE#: Entering directory '#PWD#'
w
w
#MAKE#: 'all' is up to date.
#MAKE#: Leaving directory '#PWD#'\n");
}

# sv 63537
# -w in makefile, --no-print-directory on the command line.
for my $fl (@flavors) {
run_make_test("
MAKEFLAGS${fl}-w
\$(info \$(MAKEFLAGS))
all:; \$(info \$(MAKEFLAGS))
", '--no-print-directory',
" --no-print-directory
 --no-print-directory
#MAKE#: 'all' is up to date.\n");
}

mkdir('lib2', 0777);
create_file('lib2/makefile', 'all:; $(info $(MAKEFLAGS))');

# sv 63537
# Default, no -w or --no-print-directory is specified.
run_make_test(q!
all:; $(MAKE) -C lib2
!, '',
"#MAKEPATH# -C lib2
#MAKE#[1]: Entering directory '#PWD#/lib2'

#MAKE#[1]: 'all' is up to date.
#MAKE#[1]: Leaving directory '#PWD#/lib2'\n");

# sv 63537
# --no-print-directory in makefile, -w on the command line.
for my $fl (@flavors) {
run_make_test("
MAKEFLAGS${fl}--no-print-directory
\$(info \$(MAKEFLAGS))
all:
\t \$(info \$(MAKEFLAGS))
\t \$(MAKE) -C lib2
", '-w',
"#MAKE#: Entering directory '#PWD#'
w
w
#MAKEPATH# -C lib2
#MAKE#[1]: Entering directory '#PWD#/lib2'
w
#MAKE#[1]: 'all' is up to date.
#MAKE#[1]: Leaving directory '#PWD#/lib2'
#MAKE#: Leaving directory '#PWD#'\n");
}

# sv 63537
# --no-print-directory in makefile, -w in the env.
for my $fl (@flavors) {
$ENV{'MAKEFLAGS'} = '-w';
run_make_test("
MAKEFLAGS${fl}--no-print-directory
\$(info \$(MAKEFLAGS))
all:
\t \$(info \$(MAKEFLAGS))
\t \$(MAKE) -C lib2
", '',
"#MAKE#: Entering directory '#PWD#'
w
w
#MAKEPATH# -C lib2
#MAKE#[1]: Entering directory '#PWD#/lib2'
w
#MAKE#[1]: 'all' is up to date.
#MAKE#[1]: Leaving directory '#PWD#/lib2'
#MAKE#: Leaving directory '#PWD#'\n");
}

unlink('lib2/makefile');
rmdir('lib2');

# sv 63537
# -k vs -S.


# -S in env.
$ENV{'MAKEFLAGS'} = '-S';
run_make_test(q!
.RECIPEPREFIX := >
$(info $(MAKEFLAGS))
all: one two
one:
> $(info $(MAKEFLAGS))
> #HELPER# -q fail 1
two:; $(info $@)
!, '',
"S
S
#HELPER# -q fail 1
#MAKE#: *** [#MAKEFILE#:7: one] Error 1", 512);

# -S in env, -k on the command line.
$ENV{'MAKEFLAGS'} = '-S';
run_make_test(q!
.RECIPEPREFIX := >
$(info $(MAKEFLAGS))
all: one two
one:
> $(info $(MAKEFLAGS))
> #HELPER# -q fail 1
two:; $(info $@)
!, '-k',
"k
k
#HELPER# -q fail 1
#MAKE#: *** [#MAKEFILE#:7: one] Error 1
two
#MAKE#: Target 'all' not remade because of errors.", 512);

# -k in env.
$ENV{'MAKEFLAGS'} = '-k';
run_make_test(q!
.RECIPEPREFIX := >
$(info $(MAKEFLAGS))
all: one two
one:
> $(info $(MAKEFLAGS))
> #HELPER# -q fail 1
two:; $(info $@)
!, '',
"k
k
#HELPER# -q fail 1
#MAKE#: *** [#MAKEFILE#:7: one] Error 1
two
#MAKE#: Target 'all' not remade because of errors.", 512);

# -k in env, -S on the command line.
$ENV{'MAKEFLAGS'} = '-k';
run_make_test(q!
.RECIPEPREFIX := >
$(info $(MAKEFLAGS))
all: one two
one:
> $(info $(MAKEFLAGS))
> #HELPER# -q fail 1
two:; $(info $@)
!, '-S',
"S
S
#HELPER# -q fail 1
#MAKE#: *** [#MAKEFILE#:7: one] Error 1", 512);

delete $ENV{'MAKEFLAGS'};

# -k in makefile.
for my $fl (@flavors) {
run_make_test("
MAKEFLAGS${fl}-k
\$(info \$(MAKEFLAGS))
all: one two
one:
\t \$(info \$(MAKEFLAGS))
\t #HELPER# -q fail 1
two:; \$(info \$@)
", '',
"k
k
#HELPER# -q fail 1
#MAKE#: *** [#MAKEFILE#:7: one] Error 1
two
#MAKE#: Target 'all' not remade because of errors.", 512);
}

# sv 63537
# -k in makefile and -S on the command line.
for my $fl (@flavors) {
run_make_test("
MAKEFLAGS${fl}-k
\$(info \$(MAKEFLAGS))
all: one two
one:
\t \$(info \$(MAKEFLAGS))
\t #HELPER# -q fail 1
two:; \$(info \$@)
", '-S',
"S
S
#HELPER# -q fail 1
#MAKE#: *** [#MAKEFILE#:7: one] Error 1", 512);
}

# sv 63537
# -k in makefile and -S in the env.
for my $fl (@flavors) {
$ENV{'MAKEFLAGS'} = '-S';
run_make_test("
MAKEFLAGS${fl}-k
\$(info \$(MAKEFLAGS))
all: one two
one:
\t \$(info \$(MAKEFLAGS))
\t #HELPER# -q fail 1
two:; \$(info \$@)
", '',
"S
S
#HELPER# -q fail 1
#MAKE#: *** [#MAKEFILE#:7: one] Error 1", 512);
}

delete $ENV{'MAKEFLAGS'};

# sv 63537
# -S in makefile.
for my $fl (@flavors) {
run_make_test("
MAKEFLAGS${fl}-S
\$(info \$(MAKEFLAGS))
all: one two
one:
\t \$(info \$(MAKEFLAGS))
\t #HELPER# -q fail 1
two:; \$(info \$@)
", '',
"S
S
#HELPER# -q fail 1
#MAKE#: *** [#MAKEFILE#:7: one] Error 1", 512);
}

# -S in makefile and -k on the command line.
for my $fl (@flavors) {
run_make_test("
MAKEFLAGS${fl}-S
\$(info \$(MAKEFLAGS))
all: one two
one:
\t \$(info \$(MAKEFLAGS))
\t #HELPER# -q fail 1
two:; \$(info \$@)
", '-k',
"k
k
#HELPER# -q fail 1
#MAKE#: *** [#MAKEFILE#:7: one] Error 1
two
#MAKE#: Target 'all' not remade because of errors.", 512);
}

# sv 63537
# -S in makefile and -k in the env.
for my $fl (@flavors) {
$ENV{'MAKEFLAGS'} = '-k';
run_make_test("
MAKEFLAGS${fl}-S
\$(info \$(MAKEFLAGS))
all: one two
one:
\t \$(info \$(MAKEFLAGS))
\t #HELPER# -q fail 1
two:; \$(info \$@)
", '',
"k
k
#HELPER# -q fail 1
#MAKE#: *** [#MAKEFILE#:7: one] Error 1
two
#MAKE#: Target 'all' not remade because of errors.", 512);
}


# sv 63537
# -s vs --no-silent.

# -s in env.
$ENV{'MAKEFLAGS'} = '-s';
run_make_test(q!
$(info $(MAKEFLAGS))
all:; $(info $(MAKEFLAGS))
!, '', "s\ns");

# -s in env, --no-silent on the command line.
$ENV{'MAKEFLAGS'} = '-s';
run_make_test(q!
$(info $(MAKEFLAGS))
all:; $(info $(MAKEFLAGS))
!, '--no-silent',
" --no-silent
 --no-silent
#MAKE#: 'all' is up to date.\n");

# --no-silent in env.
$ENV{'MAKEFLAGS'} = '--no-silent';
run_make_test(q!
$(info $(MAKEFLAGS))
all:; $(info $(MAKEFLAGS))
!, '',
" --no-silent
 --no-silent
#MAKE#: 'all' is up to date.\n");

# --no-silent in env, -s on the command line.
$ENV{'MAKEFLAGS'} = '--no-silent';
run_make_test(q!
$(info $(MAKEFLAGS))
all:; $(info $(MAKEFLAGS))
!, '-s', "s\ns");

delete $ENV{'MAKEFLAGS'};

# -s in the makefile.
for my $fl (@flavors) {
run_make_test("
MAKEFLAGS${fl}-s
\$(info \$(MAKEFLAGS))
all:; \$(info \$(MAKEFLAGS))
", '', "s\ns");
}

# sv 63537
# -s in makefile and --no-silent on the command line.
for my $fl (@flavors) {
run_make_test("
MAKEFLAGS${fl}-s
\$(info \$(MAKEFLAGS))
all:; \$(info \$(MAKEFLAGS))
", '--no-silent',
" --no-silent
 --no-silent
#MAKE#: 'all' is up to date.\n");
}

# sv 63537
# -s in makefile and --no-silent in the env.
for my $fl (@flavors) {
$ENV{'MAKEFLAGS'} = '--no-silent';
run_make_test("
MAKEFLAGS${fl}-s
\$(info \$(MAKEFLAGS))
all:; \$(info \$(MAKEFLAGS))
", '',
" --no-silent
 --no-silent
#MAKE#: 'all' is up to date.\n");
}

delete $ENV{'MAKEFLAGS'};

# sv 63537
# --no-silent in makefile.
for my $fl (@flavors) {
run_make_test("
MAKEFLAGS${fl}--no-silent
\$(info \$(MAKEFLAGS))
all:; \$(info \$(MAKEFLAGS))
", '',
" --no-silent
 --no-silent
#MAKE#: 'all' is up to date.\n");
}

# sv 63537
# --no-silent in makefile and -s on the command line.
for my $fl (@flavors) {
run_make_test("
MAKEFLAGS${fl}--no-silent
\$(info \$(MAKEFLAGS))
all:; \$(info \$(MAKEFLAGS))
", '-s', "s\ns");
}

# sv 63537
# --no-silent in makefile and -s in the env.
for my $fl (@flavors) {
$ENV{'MAKEFLAGS'} = '-s';
run_make_test("
MAKEFLAGS${fl}--no-silent
\$(info \$(MAKEFLAGS))
all:; \$(info \$(MAKEFLAGS))
", '', "s\ns");
}

delete $ENV{'MAKEFLAGS'};

# sv 63537
# Multiple --debug switches from various origins are all combined.
# Because run_make_test regex matching facility does not allow to match against
# multiple lines, run the test twice. During the first run match the output of
# --debug=b, during the second run match the output of --debug=-j.
#
# --debug=b in makefile.
for my $fl (@flavors) {
run_make_test("
MAKEFLAGS${fl}--debug=b
hello:; touch \$@
.PHONY: hello
", '', "/Updating makefiles/");
}

# --debug=b in makefile, --debug=j on the command line.
# Test for --debug=j output.
for my $fl (@flavors) {
run_make_test("
MAKEFLAGS${fl}--debug=b
hello:; touch \$@
.PHONY: hello
", '--debug=j', "/Putting child/");
}

# --debug=b in makefile, --debug=j on the command line.
# Test for --debug=b output.
for my $fl (@flavors) {
run_make_test("
MAKEFLAGS${fl}--debug=b
hello:; touch \$@
.PHONY: hello
", '--debug=j', "/Updating makefiles/");
}

# --debug=j in makefile, --debug=b on the command line.
# Test that MAKEFLAGS contains --debug=b.
run_make_test(q!
MAKEFLAGS=--debug=j
$(info makeflags=$(MAKEFLAGS))
hello:; touch $@
.PHONY: hello
!, '--debug=b', "/makeflags= --debug=b/");

# --debug=b in makefile, --debug=j in the env.
# Test for --debug=j output.
for my $fl (@flavors) {
$ENV{'MAKEFLAGS'} = '--debug=j';
run_make_test("
MAKEFLAGS${fl}--debug=b
hello:; touch \$@
.PHONY: hello
", '', "/Putting child/");
}

# --debug=b in makefile, --debug=j in the env.
# Test for --debug=b output.
for my $fl (@flavors) {
$ENV{'MAKEFLAGS'} = '--debug=j';
run_make_test("
MAKEFLAGS${fl}--debug=b
hello:; touch \$@
.PHONY: hello
", '', "/Updating makefiles/");
}

unlink('hello');

rmdir('localtmp');

# sv 66037. An infinite loop when MAKEFLAGS is specified on the command line.
my @cli= ('-r MAKEFLAGS=-k hello=world',
'-r MAKEFLAGS=-k hello=world MAKEFLAGS=-R',
'-r MAKEFLAGS="-R -- hello=world MAKEFLAGS=-k"');
for my $c (@cli) {
run_make_test(q!
$(info hello=$(hello))
all:;
!, $c, "hello=world\n#MAKE#: 'all' is up to date.\n");
}

run_make_test(q!
$(info hello=$(hello))
all:;
!, '-r MAKEFLAGS="-R -- hello=world MAKEFLAGS=hello=bye"',
"hello=bye\n#MAKE#: 'all' is up to date.\n");

run_make_test(q!
$(info hello=$(hello))
all:;
!, '-r MAKEFLAGS="-R -- hello=world MAKEFLAGS=-s"',
"hello=world\n");

# This tells the test driver that the perl test script executed properly.
1;
